package com.zsj.juc.reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author zsj
 * @version 1.0
 * @date 2024/5/20 12:43
 * @description 虚引用
 */
public class PhantomReferenceDemo {
    public static void main(String[] args) {
        ReferenceQueue<TestObject> referenceQueue = new ReferenceQueue<>();
        PhantomReference<TestObject> phantomReference
                = new PhantomReference<>(new TestObject(), referenceQueue);
        //可以发现 虚引用的get方法返回值总会是null
//        System.out.println(phantomReference.get());

        /*
        虚引用的作用是跟踪对线被垃圾回收的状态
        如果一个对线仅持有虚引用 那么它在任何时候都有可能被垃圾回收
         */

        List<byte[]> list = new ArrayList<>();
        new Thread(() -> {
            while (true) {
                list.add(new byte[1024 * 1024]);
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(phantomReference.get() + "list add ok");
            }
        }, "t1").start();


        new Thread(() -> {
            while (true) {
                Reference<? extends TestObject> poll = referenceQueue.poll();
                if (poll != null) {
                    System.out.println("有虚引用对象 加入了队列");
                    break;
                }
            }
        }, "t2").start();

    }
}
